From db9037d21ad2eddeb778b2e8ae683d04e3a23a4e Mon Sep 17 00:00:00 2001 From: "iap10@freefall.cl.cam.ac.uk" Date: Thu, 21 Apr 2005 21:43:23 +0000 Subject: [PATCH] bitkeeper revision 1.1357.1.1 (42681e7b7KG-juYnPnNfse4HYMkaMw) Make find_highest_irq() work for both 32 and 64 bit. Signed-off-by: Xin B Li Signed-off-by: ian@xensource.com --- xen/arch/x86/vmx_io.c | 69 +++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/xen/arch/x86/vmx_io.c b/xen/arch/x86/vmx_io.c index 70b62dceb1..fda53fc9af 100644 --- a/xen/arch/x86/vmx_io.c +++ b/xen/arch/x86/vmx_io.c @@ -282,7 +282,7 @@ void vmx_io_assist(struct exec_domain *ed) } } -#ifdef __i386__ +#if defined(__i386__) || defined(__x86_64__) static inline int __fls(u32 word) { int bit; @@ -296,53 +296,52 @@ static inline int __fls(u32 word) #define __fls(x) generic_fls(x) static __inline__ int generic_fls(u32 x) { - int r = 32; - - if (!x) - return 0; - if (!(x & 0xffff0000u)) { - x <<= 16; - r -= 16; - } - if (!(x & 0xff000000u)) { - x <<= 8; - r -= 8; - } - if (!(x & 0xf0000000u)) { - x <<= 4; - r -= 4; - } - if (!(x & 0xc0000000u)) { - x <<= 2; - r -= 2; - } - if (!(x & 0x80000000u)) { - x <<= 1; - r -= 1; - } - return r; + int r = 31; + + if (!x) + return -1; + if (!(x & 0xffff0000u)) { + x <<= 16; + r -= 16; + } + if (!(x & 0xff000000u)) { + x <<= 8; + r -= 8; + } + if (!(x & 0xf0000000u)) { + x <<= 4; + r -= 4; + } + if (!(x & 0xc0000000u)) { + x <<= 2; + r -= 2; + } + if (!(x & 0x80000000u)) { + x <<= 1; + r -= 1; + } + return r; } #endif - /* Simple minded Local APIC priority implementation. Fix later */ static __inline__ int find_highest_irq(u32 *pintr) { if (pintr[7]) - return __fls(pintr[7]) + (255-32*1); + return __fls(pintr[7]) + (256-32*1); if (pintr[6]) - return __fls(pintr[6]) + (255-32*2); + return __fls(pintr[6]) + (256-32*2); if (pintr[5]) - return __fls(pintr[5]) + (255-32*3); + return __fls(pintr[5]) + (256-32*3); if (pintr[4]) - return __fls(pintr[4]) + (255-32*4); + return __fls(pintr[4]) + (256-32*4); if (pintr[3]) - return __fls(pintr[3]) + (255-32*5); + return __fls(pintr[3]) + (256-32*5); if (pintr[2]) - return __fls(pintr[2]) + (255-32*6); + return __fls(pintr[2]) + (256-32*6); if (pintr[1]) - return __fls(pintr[1]) + (255-32*7); - return (__fls(pintr[0])-1); + return __fls(pintr[1]) + (256-32*7); + return __fls(pintr[0]); } /* -- 2.30.2